package com.pe.pgn.clubpgn.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.AfiliacionDao;
import com.pe.pgn.clubpgn.dao.CanjeDao;
import com.pe.pgn.clubpgn.domain.ClpmSerieCanje;
import com.pe.pgn.clubpgn.domain.beans.BNAlmacen;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNClientesPersona;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoMovArticulo;
import com.pe.pgn.clubpgn.model.User;
import com.pe.pgn.clubpgn.service.CanjeService;

/**
 * @author Frank
 * */

@SuppressWarnings("unchecked")
@Service("canjeService")
public class CanjeServiceImpl implements CanjeService{

	@Autowired
	private CanjeDao canjeDao;
	
	@Autowired
	private AfiliacionDao afiliacionDao;

	public List<BNDocumentoMovArticulo> obtenerListaCanje() {
		return this.canjeDao.obtenerListaCanje();
	}

	public List<BNDocumentoMovArticulo> busquedaCanje(String codeEstacion,
			String codeTarjeta, String daInicioDoc, String daFinDoc, String coCatalogo,
			String nuSerie, String nuDocumento, String deCliente, String codePremio, String stCanje, String stTipoDoc) {	
		
		List<BNDocumentoMovArticulo> canjes = new ArrayList<BNDocumentoMovArticulo>();
		List<BNDocumentoMovArticulo> canjesInst = new ArrayList<BNDocumentoMovArticulo>();
		if(stTipoDoc.equals(CLPConstantes.ST_DOCUMENTO_CANJE) || 
				stTipoDoc.equals(CLPConstantes.ST_DOCUMENTO_RESERVA)){
			canjes = canjeDao.busquedaCanje(codeEstacion, codeTarjeta, daInicioDoc, daFinDoc, coCatalogo, nuSerie, nuDocumento, deCliente, codePremio, stCanje, stTipoDoc);
		} else if(stTipoDoc.equals(CLPConstantes.ST_DOCUMENTO_CANJE_ISLA)){
			canjesInst = canjeDao.busquedaCanjeInstantaneo(codeEstacion, codeTarjeta, daInicioDoc, daFinDoc, coCatalogo, nuDocumento, deCliente, codePremio, stCanje, stTipoDoc);
		} else {
			canjes = canjeDao.busquedaCanje(codeEstacion, codeTarjeta, daInicioDoc, daFinDoc, coCatalogo, nuSerie, nuDocumento, deCliente, codePremio, stCanje, stTipoDoc);
			canjesInst = canjeDao.busquedaCanjeInstantaneo(codeEstacion, codeTarjeta, daInicioDoc, daFinDoc, coCatalogo, nuDocumento, deCliente, codePremio, stCanje, stTipoDoc);
		}
		
		canjes.addAll(canjesInst);
		return canjes;
	}

	public List<ClpmSerieCanje> obtenerListaSerieCanje() {
		return this.canjeDao.obtenerListaSerieCanje();
	}

	public BNDocumentoMovArticulo obtenerCanjePremio(Long id) {
		return this.canjeDao.obtenerCanjePremio(id);
	}

	public List<BNAlmacen> obtenerListaAlmacen() {
		return this.canjeDao.obtenerListaAlmacen();
	}

	public User getUsuarioLogueado() {
		return this.canjeDao.getUsuarioLogueado();
	}

	public BNAlmacen obtenerAlmacenPorEstacion(Long idEstacion) {
		return this.canjeDao.obtenerAlmacenPorEstacion(idEstacion);
	}

	public BNClientesPersona obtenerDatosClientePorTarjeta(String codeTarjeta) {
		return this.canjeDao.obtenerDatosClientePorTarjeta(codeTarjeta);
	}

	public BNArticulo obtenerDatosPremioPorCodigo(String codePremio,String coAlmacen) {
		return this.canjeDao.obtenerDatosPremioPorCodigo(codePremio, coAlmacen);
	}

	public List<BNArticulo> obtenerPremios(Long coalmacen, Long coCatalogo) {
		return this.canjeDao.obtenerPremios(coalmacen,coCatalogo);
	}

	public List<BNArticulo> obtenerPremiosConFiltros(String coCatalogo,
			String coCategoria, String dePremio, String deCodigoPremio,
			String stManejaStock, String stManejaSerie, String coAlmacen) {

		return this.canjeDao.obtenerPremiosConFiltros(coCatalogo, coCategoria,
		dePremio, deCodigoPremio, stManejaStock, stManejaSerie, coAlmacen);
	}

	public Map guardarCanjePremio(BNDocumentoMovArticulo bndocumento) {
		return this.canjeDao.guardarCanjePremio(bndocumento);
	}

	public void obtenerListasDatosUbigeo(Model model,
			BNDocumentoMovArticulo bnCanje) {
		this.canjeDao.obtenerListasDatosUbigeo(model,bnCanje,this.afiliacionDao);
	}

	public Map canjearReserva(BNDocumentoMovArticulo bndocumento) {
		return this.canjeDao.canjearReserva(bndocumento);
	}

	public List<ClpmSerieCanje> obtenerListaSerieCanjePorEstacionTipoDocumento(
			String codeEstacion, String stTipoDoc) {
		return this.canjeDao.obtenerListaSerieCanjePorEstacionTipoDocumento(
		codeEstacion, stTipoDoc);
	}

	public List<ClpmSerieCanje> obtenerListaSerieCanjePorAlmacenTipoDocumento(
			String coAlmacen, String stTipoDoc) {
		return this.canjeDao.obtenerListaSerieCanjePorAlmacenTipoDocumento(coAlmacen, stTipoDoc);
	}

	public BNDocumentoMovArticulo obtenerCanjesInstantaneo(String id, String codCanje){
		return canjeDao.obtenerCanjesInstantaneo(id, codCanje);
	}
}
